利用 CLI 和脚本实现自动化批量提取表格中网址的内容并保存到本地
这个方法需要在命令行中操作,是处理大批量链接最高效的方式。
了解 CLI 工具:Obsidian Web Clipper 提供了命令行工具 (CLI),能独立于浏览器直接根据 URL 抓取网页内容,生成结构化的 Markdown 文件。
准备工作:确认已安装 Node.js 环境。
安装 CLI 工具:在终端或命令提示符中运行以下命令:
bash
npm install -g obsidian-clipper
编写脚本并执行:以下是核心步骤,我会提供一个使用教程:
第一步:导出并整理链接:从 Excel 中将所有网址和文件名整理成一个 CSV 文件(推荐 links.csv),格式如下。
第二步:创建脚本文件:新建一个 batch_clipper.js 文件,将下面的代码复制进去。
第三步:修改脚本:根据注释,把 /path/to/your/vault/Clippings/、links.csv 文件路径等换成你自己的。
第四步:运行脚本:在终端里运行 node batch_clipper.js。
📝 点击查看具体的 `batch_clipper.js` 代码
javascript
const { exec } = require('child_process');
const fs = require('fs');
const path = require('path');
// --- 请将路径替换为你自己的实际路径 ---
const VAULT_PATH = '/path/to/your/vault/Clippings/';
const CSV_FILE_PATH = path.join(__dirname, 'links.csv');
// ----------------------------------------------
// 确保保存路径以斜杠结尾,便于拼接文件名
const normalizedVaultPath = VAULT_PATH.endsWith('/') ? VAULT_PATH : VAULT_PATH + '/';
// 1. 读取CSV文件
fs.readFile(CSV_FILE_PATH, 'utf8', (err, data) => {
if (err) {
console.error(`读取CSV文件失败: ${err}`);
return;
}
// 2. 解析CSV (简单版本,如果内容包含逗号请使用更健壮的库如 'csv-parser')
const lines = data.split('\n');
// 假设CSV没有表头,第一列是URL,第二列是文件名
for (const line of lines) {
if (line.trim() === '') continue;
const [url, fileName] = line.split(',');
if (!url) {
console.log('跳过无效行:', line);
continue;
}
// 3. 构造命令
const finalFileName = fileName ? fileName.trim() : generateFileNameFromUrl(url);
const fullPath = `${normalizedVaultPath}${finalFileName}.md`;
// 使用 obsidian-clipper 命令进行抓取
const command = `obsidian-clipper clip "${url}" --output "${fullPath}"`;
// 4. 执行抓取
console.log(`正在抓取: ${url} -> ${fullPath}`);
exec(command, (error, stdout, stderr) => {
if (error) {
console.error(`抓取失败 ${url}: ${error}`);
return;
}
console.log(`成功抓取: ${url}`);
});
}
});
function generateFileNameFromUrl(url) {
// 生成一个安全的文件名
try {
const urlObj = new URL(url);
let fileName = urlObj.hostname + urlObj.pathname;
fileName = fileName.replace(/[^a-z0-9]/gi, '_').toLowerCase();
return fileName.substring(0, 50); // 限制长度
} catch (e) {
return 'unknown_' + Date.now();
}
}